package studia.figlewicz.math.library;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MagazynMonteCarlo {
	
	public MagazynMonteCarlo(int size) {
		this.size = size;
		trajektorieSymulacji = new ArrayList<Map<Model, Map<String, TrajektoriaProcesu>>>(size);
		for (int i=0; i<size; i++)
			trajektorieSymulacji.add(new HashMap<Model, Map<String, TrajektoriaProcesu>>());
		
	}
	
	
	private final int size;
	public int getSize() {
		return size;
	}
	public int size() {
		return trajektorieSymulacji.size();
	}

	ArrayList<Map<Model, Map<String, TrajektoriaProcesu>>> trajektorieSymulacji;
	public ArrayList<Map<Model, Map<String, TrajektoriaProcesu>>> getTrajektorieSymulacji() {
		return trajektorieSymulacji;
	}
	public Map<Model, Map<String, TrajektoriaProcesu>> getTrajektorieSymulacji(int numerSymulacji) {
		Map<Model, Map<String, TrajektoriaProcesu>> resoult = null;
		if (trajektorieSymulacji.size( )< numerSymulacji)
			return resoult;
		else if (trajektorieSymulacji.get(numerSymulacji) == null)
			return resoult;
		
		resoult = trajektorieSymulacji.get(numerSymulacji);
		return resoult;
	}
	
	public ArrayList<Map<String, TrajektoriaProcesu>> getTrajektorieSymulacji(Model model) {
		ArrayList<Map<String, TrajektoriaProcesu>> resoult = null;
		if (trajektorieSymulacji.size() == 0)
			return resoult;
		if (trajektorieSymulacji.get(0).get(model) == null)
			return resoult;
		
		resoult = new ArrayList<Map<String, TrajektoriaProcesu>>();
		for (Map<Model, Map<String, TrajektoriaProcesu>> symylacje : trajektorieSymulacji) {
			resoult.add(symylacje.get(model));
		}
		return resoult;
	}
	public Map<String, TrajektoriaProcesu> getTrajektorieSymulacji(Model model, int numerSymulacji) {
		Map<String, TrajektoriaProcesu> resoult = null;
		Map<Model, Map<String, TrajektoriaProcesu>> temp = getTrajektorieSymulacji(numerSymulacji);
		if (temp == null)
			return resoult;
		
		if (temp.get(model) == null)
			return resoult;
		resoult = temp.get(model);
		return resoult;
	}
	
	public ArrayList<TrajektoriaProcesu> getTrajektorieSymulacji(Model model, String zmiennaObjasniana) {
		ArrayList<TrajektoriaProcesu> resoult = null;
		if (trajektorieSymulacji.size() == 0)
			return resoult;
		if (trajektorieSymulacji.get(0).get(model) == null)
			return resoult;
		if (trajektorieSymulacji.get(0).get(model).get(zmiennaObjasniana) == null)
			return resoult;
		
		resoult = new ArrayList<TrajektoriaProcesu>();
		for (int i=0; i<trajektorieSymulacji.size(); i++) {
			TrajektoriaProcesu trajektoria = getTrajektorieSymulacji(model, zmiennaObjasniana, i);
			resoult.add(trajektoria);
		}
		return resoult;
	}
	public TrajektoriaProcesu getTrajektorieSymulacji(Model model, String zmiennaObjasniana, int numerSymulacji) {
		TrajektoriaProcesu resoult = null;
		Map<Model, Map<String, TrajektoriaProcesu>> temp = getTrajektorieSymulacji(numerSymulacji);
		if (temp == null)
			return resoult;
		
		if (temp.get(model) == null)
			return resoult;
		if (temp.get(model).get(zmiennaObjasniana) == null)
			return resoult;
		resoult = temp.get(model).get(zmiennaObjasniana);
		return resoult;
	}
	
	
	public void archiwizujTrajektorieNowejSymulacji(Map<Model, Map<String, TrajektoriaProcesu>> wynikSymulacji) {
		trajektorieSymulacji.add(wynikSymulacji);
	}
	public void archiwizujTrajektorieNowejSymulacji(Map<Model, Map<String, TrajektoriaProcesu>> wynikSymulacji, int numerSymulacji) {
		trajektorieSymulacji.add(numerSymulacji, wynikSymulacji);
	}
	public void archiwizujTrajektorie(Model model, Map<String, TrajektoriaProcesu> trajektorie, int numerSymulacji) {
		Map<Model, Map<String, TrajektoriaProcesu>> wynikSymulacji = null;
		if (trajektorieSymulacji.get(numerSymulacji) == null) {
			wynikSymulacji = new HashMap<Model, Map<String, TrajektoriaProcesu>>();
			
			trajektorieSymulacji.add(numerSymulacji,wynikSymulacji);
		}
		else {
			wynikSymulacji = trajektorieSymulacji.get(numerSymulacji);
			
			Map<String, TrajektoriaProcesu> tempTrajektorie = new HashMap<String, TrajektoriaProcesu>();
			for (String s : trajektorie.keySet())
				tempTrajektorie.put(s, trajektorie.get(s));
			
		}
		wynikSymulacji.put(model, trajektorie);
	}
	public void archiwizujTrajektorie(Model model, String zmiennaObjasniana, TrajektoriaProcesu trajektoria, int numerSymulacji) {
		Map<Model, Map<String, TrajektoriaProcesu>> wynikSymulacji = null;
		Map<String, TrajektoriaProcesu> trejektorie = null;
		if (trajektorieSymulacji.get(numerSymulacji) == null) {
			wynikSymulacji = new HashMap<Model, Map<String, TrajektoriaProcesu>>();
			trejektorie = new HashMap<String, TrajektoriaProcesu>();
			trajektorieSymulacji.add(numerSymulacji,wynikSymulacji);
		}
		else if (trajektorieSymulacji.get(numerSymulacji).get(model) == null) {
			trejektorie = new HashMap<String, TrajektoriaProcesu>();
		}
		else {
			trejektorie = trajektorieSymulacji.get(numerSymulacji).get(model);

		}
		trejektorie.put(zmiennaObjasniana, trajektoria);
		wynikSymulacji.put(model, trejektorie);
	}
	
	
	
}

